x86 hvm: Fix VLAPIC TMCCT register when timer is one-shot
authorKeir Fraser <keir@xen.org>
Tue, 7 Dec 2010 18:10:46 +0000 (18:10 +0000)
committerKeir Fraser <keir@xen.org>
Tue, 7 Dec 2010 18:10:46 +0000 (18:10 +0000)
Signed-off-by: Keir Fraser <keir@xen.org>
xen/arch/x86/hvm/vlapic.c

index 3b94ca96a81456c07e8992b8c07603b348d18b63..f394518caf9e81ac40b2e9d22b57c856ba82a0fa 100644 (file)
@@ -430,7 +430,7 @@ static uint32_t vlapic_get_tmcct(struct vlapic *vlapic)
 
     counter_passed = ((hvm_get_guest_time(v) - vlapic->timer_last_update)
                       / APIC_BUS_CYCLE_NS / vlapic->hw.timer_divisor);
-    tmcct = tmict - counter_passed;
+    tmcct = (counter_passed < tmict) ? tmict - counter_passed : 0;
 
     HVM_DBG_LOG(DBG_LEVEL_VLAPIC_TIMER,
                 "timer initial count %d, timer current count %d, "
@@ -677,7 +677,8 @@ static int vlapic_write(struct vcpu *v, unsigned long address,
                   (uint32_t)val * vlapic->hw.timer_divisor);
         create_periodic_time(current, &vlapic->pt, period, 
                              vlapic_lvtt_period(vlapic) ? period : 0,
-                             vlapic->pt.irq, vlapic_pt_cb,
+                             vlapic->pt.irq,
+                             vlapic_lvtt_period(vlapic) ? vlapic_pt_cb : NULL,
                              &vlapic->timer_last_update);
         vlapic->timer_last_update = vlapic->pt.last_plt_gtime;
 
@@ -874,7 +875,8 @@ static void lapic_rearm(struct vlapic *s)
     s->pt.irq = vlapic_get_reg(s, APIC_LVTT) & APIC_VECTOR_MASK;
     create_periodic_time(vlapic_vcpu(s), &s->pt, period,
                          vlapic_lvtt_period(s) ? period : 0,
-                         s->pt.irq, vlapic_pt_cb,
+                         s->pt.irq,
+                         vlapic_lvtt_period(s) ? vlapic_pt_cb : NULL,
                          &s->timer_last_update);
     s->timer_last_update = s->pt.last_plt_gtime;
 }